입출력, 연산
이제 간단한 입출력 함수와 사칙 연산 및 나머지 연산을 이용한 연습 문제들을 풀어보면서 온라인 저지의 사용 방법 및 문제를 푸는 과정에 익숙해져 봅시다.
이제 아래의 연습 문제들을 순서대로 풀어 볼텐데, 가급적이면 문제를 혼자서 풀려고 시도해보신 후 풀이 부분을 읽어보시기 바랍니다.
1000. A + B
두 개의 정수를 입력받아 두 수의 합을 출력하는 문제입니다. C / C++의 경우 정수형 변수 두개를 입력 받아서 출력하면 되지만, 파이썬의 경우 입력이 문자열로 들어오기 때문에 이 문자열을 다시 잘라서 정수로 바꾸는 과정이 필요합니다. 파이썬 사용자의 경우 입력을 처리하는 부분이 처음에 좀 어렵게 느껴질 수 있습니다.
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a + b);
return 0;
}
C++의 경우 물론 cin / cout을 이용한 입출력을 써도 무방합니다. 하지만 PS에서는 몇 가지 경우를 제외하곤 cin / cout보다 scanf / printf가 더 편리한 경우가 많아 예시코드는 scanf / printf를 사용하는 것을 기준으로 작성하겠습니다. 물론 어느 정도는 취향의 영역에 있는 부분이라 꼭 scanf / printf를 쓸 필요는 없고 자신이 편리한 방법을 써도 무방합니다.
a, b = map(int, input().split())
print(a + b)
파이썬의 경우 input()으로 입력받은 문자열을 우선 공백 기준으로 분리해줘야 합니다. 이를 split() 함수로 처리해줄 수 있습니다. 그 다음엔 분리된 문자열들을 다시 int로 바꿔서(이 과정을 map 함수가 수행해 줍니다) 각각을 a와 b에 대입하고, 그 둘을 더한 값을 출력해주면 됩니다.
1001. A - B
거의 동일한 문제입니다. 이번엔 덧셈 대신 뺄셈만 하면 됩니다. 이 문제도 풀어 봅시다!
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a - b);
return 0;
}
a, b = map(int, input().split())
print(a - b)
10998. A×B
이번엔 곱셈입니다. 이 것도 덧셈 뺄셈과 거의 비슷하게 풀 수 있겠죠.
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a * b);
return 0;
}
a, b = map(int, input().split())
print(a * b)
1008. A/B
이 문제는 이제 조금 어려울 수 있습니다. 나눗셈은 정확하게 정수로 나누어 떨어지는게 아니라 실수값을 다뤄야 하기 때문에 이에 대한 처리가 필요합니다.
여기서, 문제를 보시면 스페셜 저지 라는 태그가 붙어 있는 것을 확인할 수 있습니다. 스페셜 저지는 채점 방식이 일반적인 문제와 조금 다르게 다루어지는 문제입니다. 보통 문제는 앞에서 설명했던 것처럼 주어진 입력 파일에 대해 기대하는 출력과 우리가 작성한 프로그램이 만든 출력이 완벽하게 동일해야 정답인 것으로 생각합니다. 반면, 스페셜 저지 문제는 채점 서버가 알고 있는 출력과 우리가 낸 답안이 조금 달라도 정답이 가져야 하는 조건을 만족하기만 하면 정답으로 취급해주는 문제입니다.
이 문제에 스페셜 저지 태그가 붙어 있는 이유는 문제의 출력 란에서 확인할 수 있습니다.
절대/상대 오차는 까지 허용한다.
이 말은, 우리가 낸 답안이 정답과 어느 정도 오차가 있어도 답으로 처리해준다는 뜻입니다. 컴퓨터의 실수 연산은 컴퓨터가 부동소수점을 관리하는 방법 때문에 절대 정확한 값을 다룰 수 없습니다. 절대 오차, 상대 오차 및 부동 소수점에 대해 더 자세한 지식이 궁금하신 분은 참고 파트의 컴퓨터의 실수 연산 글을 읽어 보시면 됩니다.
이제 이 문제를 한 번 풀어봅시다. C, C++의 경우 정수형 끼리 나눗셈을 한 결과는 정수형으로 취급되어 1의 자리 아래의 값은 모두 사라집니다. 따라서 이 부분을 제대로 다뤄주기 위해 정수를 double 등의 실수 타입으로 캐스팅해주는 과정이 필요합니다. 반면 파이썬의 경우, 정수형 나눗셈과 실수형 나눗셈이 별도의 연산자로 나뉘어있기 때문에 이러한 캐스팅 과정이 필요 없습니다.
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%.9lf\n", (double)a / b);
return 0;
}
오차 허용 범위가 이기 때문에, 소숫점 아래 9자리까지는 출력을 해 주어야 합니다. float타입의 경우 이 정도 단위까지 값을 정밀하게 저장해주지 못하기 때문에 double 타입을 사용해야 합니다.
PS에서 cin / cout 보다 scanf / printf가 좀 더 편리한 이유 중 하나가 이 문제와 같이 실수 값의 출력 자리수를 결정하기 쉽다는 것입니다. cin / cout을 이용할 경우 setprecision
함수를 이용해서 소수점 아래 자리수를 어디까지 표기할지를 지정해줘야하는데 이게 좀 불편합니다.
a, b = map(int, input().split())
print(a / b)
파이썬의 경우 간단히 두 수를 나눈 값을 출력해주면 정답이 됩니다. 소수점 아래는 버리는 정수 나눗셈을 하고 싶다면 별도의 정수 나눗셈 연산자인 //
를 쓰시면 됩니다.
3046. R2
기본적인 사칙연산과 입출력 함수를 이용하는 법을 충분히 연습했으니 이제 좀 더 어려운 문제를 풀어봅시다. 이 문제는 간단한 수식 전개로 풀 수 있는 문제인데, 잘 안 풀린다면 공책에 식을 직접 적어서 여러 방면으로 고민해 봅시다.
라는 식에서 시작해봅시다. 우선 양변에 2를 곱하면, 라는 식이 나옵니다. 여기서 우리는 S와 R1를 이용해서 R2를 구해야 합니다. 다시 양변에 R1을 빼 봅시다.
즉, R2 값은 과 같습니다. S와 R1을 입력받은 다음 을 출력하면 문제를 해결할 수 있습니다.
#include <stdio.h>
int main()
{
int r1, s;
scanf("%d %d", &r1, &s);
printf("%d\n", 2 * s - r1);
}
r1, s = map(int, input().split())
print(2 * s - r1)